package com.yc.thread;

/***
 * 1.函数式接口中只能有一个抽象方法（我们在这里不包括与Object的方法重名的方法）
 * 2.可以有从Object继承过来的抽象方法 因为所有类的最终父类都是Object
 * 3.接口中唯一抽象方法的命名并不重要 因为函数式接口就是对某一行为进行抽象 主要目的就是支持Lambda表达式
 */

@FunctionalInterface
interface Action<T>{
    void execute(T t );
}

/***
 * 函数式编程语法的一个理解
 */
public class Test11_function {
    public static void main(String[] args) {
        //外部类
        Action action3=new MyAction();
        action3.execute("hhhhh");

        //匿名内部类
        Action action4=new Action() {
            @Override
            public void execute(Object o) {
                System.out.println( o );
            }
        };
        action4.execute("你好");


        //Lambda语法
        Action action2=(t)-> {
            //处理。。。
            System.out.println(t);
        };
        action2.execute("bye");

        //直接绑定
        Action action=System.out::println;  //  System.out.println(1);
        action.execute("hello world");

        //作为参数用
        test(System.out::println,"hello world");
    }
    static void test(Action action,String str){
        action.execute(str);
    }
}

class MyAction implements Action{
    @Override
    public void execute(Object o){
        System.out.println( o );
    }
}
